# -*- coding: utf-8 -*-
from flask import Flask,request,render_template
from keras.src.utils import load_img,img_to_array
import model
app=Flask(__name__)
x=model.x_train
model=model.VGG16()
model.build(x.shape)
model.load_weights('model.weights.h5')


def read_image(path):
    img=load_img(path,target_size=x.shape)
    img=img_to_array(img)
    return img

@app.route('/')
def home():
    return render_template('home.html')


@app.route('/predict', methods=['POST'])
def predict():
    if request.method=='POST':
        file=request.files.get('file')
        filename=file.filename
        path=f'static/{filename}'
        file.save(path)
        img=read_image(path)
        predict=model.predict(img).argmax()
        cifar10_labels = {
            0: 'airplane（飞机）',
            1: 'automobile（汽车）',
            2: 'bird（鸟）',
            3: 'cat（猫）',
            4: 'deer（鹿）',
            5: 'dog（狗）',
            6: 'frog（青蛙）',
            7: 'horse（马）',
            8: 'ship（船）',
            9: 'truck（卡车）'
        }
        return render_template('predict.html',path=path,pred=cifar10_labels[predict])
if __name__ == '__main__':
    app.run(host='0.0.0.0',port=6008,debug=True)
# 2.Web应用的搭建功能性约束
# 1)图像上传：
# 用户可以通过Web界面上传图像文件。
# 应用应支持常见的图像格式（如JPEG、PNG等）。
# 2)图像预处理：
# 上传的图像应被调整为32x32像素的大小。
# 图像数据应被归一化到[0, 1]区间。
# 3)模型预测：
# 应用应使用预训练的VGG16模型进行图像分类。
# 模型应能够处理预处理后的图像数据并输出预测结果。
# 4)结果展示：
# 应用应将预测结果以文本形式展示给用户。
# 应用还应展示用户上传的图像。
# 5)错误处理：
# 如果在图像上传或预测过程中发生错误，应用应能够捕获异常并返回错误信息。
# 6)Web服务器：
# 应用应在本地主机上以指定的端口（如6008）运行。
# 应用应开启调试模式以便于开发过程中的调试。
# 7)代码结构：
# 应用应具有良好的代码结构，包括模块化的函数和清晰的注释。
# 应用的路由应清晰定义，以便于理解和维护。
# 8)安全性：
# 应用应确保上传的图像文件是安全的，不会执行恶意代码。
# 9)可扩展性：
# 应用的设计应考虑到未来的扩展性，如添加更多的模型或处理更多的图像格式。
# 10)用户友好性：
# Web界面应简洁易用，为用户提供清晰的指示和反馈。